import serial
"""
    2021-08-31  15:04   by  CYL
    文件名：
        ESP8266pyByCYL.py
    文件说明：
        除了findSerialPort()、serial_Port_Init()外，均已ESP8266特化。
"""
def readBytesFromESP8266(targetSerial:serial.serialwin32.Serial,repeatTime:int=10):
    """
        2021-08-31  13:35   by  炸天帮成员
        函数名：
            readBytesFromESP8266()
        函数用途：
            用于获取来自ESP8266的UART返回值。在通用型的基础上做了去除空byte流的操作。
            通过修改repeatTime，可以对ESP8266的返回内容做出条数删选。
        函数类型：
            MicroPython特化函数。
            将if和for去除后，即为单次通用型函数readBytesFromUART()。
    :param targetSerial:    一般为ESP8266所在的端口号所对应的serial.serialwin32.Serial类型的对象。一般来自serial_Port_Init()。
    :param repeatTime:  xxx.read()重复扫描的次数，间隔时间在serial_Port_Init()中的timeout中设置。可以在一定程度上解决EOF遇到0x0d0x0a后的问题。
    :return:
    """
    for looptime in range(0,repeatTime):
        data_return = targetSerial.read()  # 可以按字节数读取来自下位机的串口内容，此处设定为100字节
        if data_return != b'':
            #print('data_return = ', data_return)  # 显示从COM端读取到的内容
            data_in_waiting = targetSerial.read(targetSerial.in_waiting)
            #print('ser.in_waiting =', data_in_waiting)
            result = data_return + data_in_waiting
            print('esp8266返回：', result.decode(encoding="UTF-8"))

def sendStringToESP8266(targetSerial:serial.serialwin32.Serial,theContent: str):
    """
        2021-08-31  13:41   BY  炸天帮成员
        函数名：
            sendStringToESP8266()
        函数用途：
            用于向ESP8266中传入Bytes字节流，并得到其返回值。
        函数类型：
            MicroPython特化函数。
            去除readBytesFromESP8266()后，为普通无读取功能的通用型函数。
    :param targetSerial:一般为ESP8266所在的端口号所对应的serial.serialwin32.Serial类型的对象。一般来自serial_Port_Init()。
    :param theContent:  用于向ESP8266中传入Bytes字节流所对应的字符串内容。
    :return:
    """
    send_bytes = bytes(theContent, encoding='UTF-8') + b'\x0d\x0a'
    send_string = send_bytes.decode('UTF-8')
    #print('send_bytes = ', send_bytes, 'send_bytes 的类型为：', type(send_bytes), '\nsend_string = ', send_string,' send_string 的类型为', type(send_string))
    targetSerial.write(send_bytes)                  # 发送数据至ESP8266。
    readBytesFromESP8266(targetSerial=targetSerial) # 读取来自ESP8266的数据。

def ESP8266pyUARTConnect(targetSerial:serial.serialwin32.Serial):
    """
        函数名：
            ESP8266pyUARTConnect()
        函数说明：
            使用ESP8266特化型的函数，从而来实现和MCUpyUARTConnect()相类似的功能。
    :param targetSerial:    serial.serialwin32.Serial对象，一般由serial_Port_Init()获得。
    :return:
    """
    targetSerial.open()  # 开启ESP8266端口
    if targetSerial.is_open:

        sendStringToESP8266(targetSerial=targetSerial,theContent="import machine")
        sendStringToESP8266(targetSerial=targetSerial,theContent="machine.freq()")

    targetSerial.close()  # 关闭ESP8266端口